<?php
/**
 * @author Vitaly
 * Date: 25.04.12
 */

/*
 * Служит прослойкой между моделью юзера и работой с DbService
 */

class UserMapper
{
    private $connection; // хранит ссылку на singleton экземпляр DbService

    function __construct()
    {
        $this->connection = DbService::instance();
    }

    // выполняет добавление юзера из модели в БД
    // возвращает id юзера

    function add(UserModel $user)
    {
        $userdata = array(
            'nick'     => $user->getNick(),
            'email'    => $user->getEmail(),
            'password' => $user->getPassword(),
            'status'   => $user->getStatus()
        );
        $user->setId($this->connection->insert('users', $userdata));
        return $user->getId();
    }

    // выполняет обновление юзера по его модели
    // идентификация юзера в БД происходит по id из модели

    function update(UserModel $user)
    {
        $this->connection->update("users",
                                  "`nick`='"     . $user->getNick()     . "'," .
                                  "`email`='"    . $user->getEmail()    . "'," .
                                  "`password`='" . $user->getPassword() . "'," .
                                  "`status`='"   . $user->getStatus()   . "'"  .
                                  "`rating`='"   . $user->getRating()   . "'"  .
                                  "`last_up`='"  . $user->getLastUp()   . "'",
                                  "id=" . $user->getId()
        );
    }

    // выполняет поиск юзера по id
    // возвращает модель юзера или false

    function find($id)
    {
        $result = mysql_fetch_assoc($this->connection->select('users', 'id=' . $id));
        if(!empty($result))
        {
            $newUserModel = new UserModel($result['id'],
                                          $result['nick'],
                                          $result['email'],
                                          $result['password'],
                                          $result['status'],
                                          $result['rating'],
                                          $result['last_up']
            );
            return $newUserModel;
        }
        else
            return false;
    }

    // выполняет "расширенный" поиск
    // параметром $whereExpression используется как "WHERE $whereExpression"
    // возвращает модель юзера или false

    function extFind($whereExpression)
    {
        $result = mysql_fetch_assoc($this->connection->select('users', $whereExpression));
        if(!empty($result))
        {
            $newUserModel = new UserModel($result['id'],
                                          $result['nick'],
                                          $result['email'],
                                          $result['password'],
                                          $result['status'],
                                          $result['rating'],
                                          $result['last_up']
            );
            return $newUserModel;
        }
        else return false;
    }

    // выполняет удаление юзера из БД по id $id

    function delete($id)
    {
        $this->connection->delete("users", "`id`="  . $id);
    }

    // проверяет существование в таблице юзеров строк с почтой $email или ником $nick
    // возвращает количество таких строк

    function checkExist($email, $nick = null)
    {
        return mysql_num_rows($this->connection->select("users", "`email`='" . $email . "'" . ((!empty($nick)) ? " OR `nick`='" . $nick . "'" : "")));
    }

    // увеличивает рейтинг юзера с id $userId
    // проверяет временное ограничение на увеличение рейтинга
    // в случае неудачи возвращает false

    function upRating($userId)
    {
        $time = time();
        if(($this->find($_SESSION['userid'])->getLastUp()+60) < $time)
        {
            $this->connection->update("users", "`last_up` = " . $time , "`id` = " . $_SESSION['userid']);
            return $this->connection->update("users", "`rating` = `rating` + 1", "id=" . $userId);
        }
        else return false;
    }
}
